import axios from 'axios'
import { ElNotification , ElMessageBox, ElMessage, ElLoading } from 'element-plus'
import { getToken } from './auth';
import { useUserStore } from '@/stores/user';


// 是否显示重新登录
export let isRelogin = { show: false };

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'

const service = axios.create({
  baseURL: import.meta.env.VITE_PROXY_URL, // api 的 base_url 注意 vue3 .env文件有强制性的 VITE_ 开头
  timeout: 80000, // request timeout
});

// request interceptor
service.interceptors.request.use(
  
  (config: any) => {
    let token: string|null = getToken(); //此处换成自己获取回来的token，通常存在在cookie或者store里面
    if (token) {
      // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
      config.headers["authorization"] = token;
    }
    return config;
  },
  (error) => {
    ElMessage.error(`出错啦！${error.message}`)
    Promise.reject(error);
  }
);

// response interceptor
service.interceptors.response.use(res => {
    // 未设置状态码则默认成功状态
    const code = res.data.code
    const msg = res.data.message || '未知错误！'
    // console.log('msg', msg);
    
    // 二进制数据则直接返回
    if(res.request.responseType ===  'blob' || res.request.responseType ===  'arraybuffer'){
      return res.data
    }

    if (code === 401) {
      
      ElMessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
        isRelogin.show = false;
        useUserStore().logout().then(() => {
          location.href = '/login';
        })
      }).catch(() => {
        isRelogin.show = false;
      });
      return Promise.reject("无效的会话")
    }
    if (code !== 200) {
      ElMessage({ message: msg, type: 'error' })
      console.log('false');
      
      return Promise.reject(new Error(msg))
    }
    return res.data

  },error => {
  if (error.response.status === 401) {
    console.log('error 401');

    if (!isRelogin.show) {
      isRelogin.show = true;
      ElMessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
        isRelogin.show = false;
        useUserStore().logout().then(() => {
          location.href = '/login';
        })
      }).catch(() => {
        isRelogin.show = false;
      });
    }
    return Promise.reject('无效的会话，或者会话已过期，请重新登录。')
    // location.href = '/login';
  }
  Promise.reject(error)
}
);

export const request = (options: any) => {
  return new Promise<any>((resolve, reject) => {
    // 请求处理
    service(options)
      .then((res: any) => {
        if (res.code === 200) {
          
          resolve(res)
        } else {
          reject(res);
        }
      })
      .catch((error) => {
          ElMessage.error(error.message)
        reject(error);
      });
  });
};
 
export default request;
